import { NextRequest, NextResponse } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
import prisma from '@/lib/prisma'

export async function PUT(
  request: NextRequest,
  { params }: { params: { id: string } }
) {
  try {
    const session = await getServerSession(authOptions)
    
    if (!session?.user) {
      return NextResponse.json({ message: '未授权' }, { status: 401 })
    }

    // 只有教师和管理员可以更新分组
    if (session.user.role !== 'TEACHER' && session.user.role !== 'ADMIN') {
      return NextResponse.json({ message: '权限不足' }, { status: 403 })
    }

    const groupId = params.id
    const body = await request.json()
    const { name, description, leaderId } = body

    // 验证分组是否存在且属于当前用户的实验
    const group = await prisma.group.findFirst({
      where: {
        id: groupId,
        experiment: {
          createdById: session.user.id
        }
      },
      include: {
        members: true
      }
    })

    if (!group) {
      return NextResponse.json({ message: '分组不存在或无权限' }, { status: 404 })
    }

    // 如果要更改组长，验证新组长是否是组成员
    if (leaderId) {
      const isLeaderInGroup = group.members.some(member => member.userId === leaderId)
      if (!isLeaderInGroup) {
        return NextResponse.json({ message: '指定的组长不是该组成员' }, { status: 400 })
      }
    }

    // 开始事务更新
    const updatedGroup = await prisma.$transaction(async (tx) => {
      // 更新分组基本信息
      const updated = await tx.group.update({
        where: { id: groupId },
        data: {
          name: name || group.name,
          description: description !== undefined ? description : group.description
        }
      })

      // 如果需要更改组长
      if (leaderId) {
        // 将所有成员设为普通成员
        await tx.groupMember.updateMany({
          where: { groupId },
          data: { role: 'MEMBER' }
        })

        // 设置新组长
        await tx.groupMember.update({
          where: {
            groupId_userId: {
              groupId,
              userId: leaderId
            }
          },
          data: { role: 'LEADER' }
        })
      }

      // 返回更新后的完整分组信息
      return await tx.group.findUnique({
        where: { id: groupId },
        include: {
          members: {
            include: {
              user: {
                select: {
                  id: true,
                  name: true,
                  email: true
                }
              }
            }
          }
        }
      })
    })

    return NextResponse.json({ group: updatedGroup })
  } catch (error) {
    console.error('更新分组失败:', error)
    return NextResponse.json({ message: '更新分组失败' }, { status: 500 })
  }
}

export async function DELETE(
  request: NextRequest,
  { params }: { params: { id: string } }
) {
  try {
    const session = await getServerSession(authOptions)
    
    if (!session?.user) {
      return NextResponse.json({ message: '未授权' }, { status: 401 })
    }

    // 只有教师和管理员可以删除分组
    if (session.user.role !== 'TEACHER' && session.user.role !== 'ADMIN') {
      return NextResponse.json({ message: '权限不足' }, { status: 403 })
    }

    const groupId = params.id

    // 验证分组是否存在且属于当前用户的实验
    const group = await prisma.group.findFirst({
      where: {
        id: groupId,
        experiment: {
          createdById: session.user.id
        }
      }
    })

    if (!group) {
      return NextResponse.json({ message: '分组不存在或无权限' }, { status: 404 })
    }

    // 删除分组（会级联删除GroupMember）
    await prisma.group.delete({
      where: {
        id: groupId
      }
    })

    return NextResponse.json({ message: '分组删除成功' })
  } catch (error) {
    console.error('删除分组失败:', error)
    return NextResponse.json({ message: '删除分组失败' }, { status: 500 })
  }
} 